import socket
import struct
import sys
import time
import mysql.connector  # 新增导入 mysql.connector

from PyQt5.QtCore import QTimer, QThread, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QMovie
from PyQt5.QtWidgets import QApplication, QMainWindow

from linked import Ui_MainWindow

# TCP/IP服务器地址和端口
# 光照连接串口服务器COM1  对应端口为26
SERVER_ADDRESS1 = '192.168.1.100'
SERVER_PORT1 = 23

# 创建另一个 TCP 套接字对象
client_socket1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到光照传感器服务器
client_socket1.connect((SERVER_ADDRESS1, SERVER_PORT1))

# 定义一个继承自 QThread 的类，用于在后台读取 TCP 数据
class TcpReadThread(QThread):
    # 定义一个信号，用于在接收到响应时发出通知
    responseReceived = pyqtSignal(int, bytes)

    def run(self):
        # 调用读取温湿度数据的方法
        self.readWSD()

    def readWSD(self):
        try:
            # 打印开始采集数据的信息
            print("开始采集1......", SERVER_ADDRESS1, SERVER_PORT1)
            # 向服务器发送十六进制请求数据
            client_socket1.sendall(bytes.fromhex("01 03 00 07 00 02 75 CA"))
            # 接收服务器返回的数据，最多接收 1024 字节
            data = client_socket1.recv(1024)
            # 打印接收到的数据
            print(data)
            # 发出信号，通知主线程接收到了数据
            self.responseReceived.emit(1, data)
        except socket.error as e:
            # 打印连接服务器失败的错误信息
            print(f"无法连接到服务器1：{str(e)}")

# 定义主窗口类，继承自 QMainWindow 和自定义的 UI 类
class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        # 调用父类的构造函数
        super(MainWindow, self).__init__()
        # 设置 UI
        self.setupUi(self)
        # 初始化模式变量
        self.mode = 0
        # 初始化 fs 变量
        self.fs = None
        # 创建一个 QMovie 对象，用于加载动画
        self.movie = QMovie('1.gif')
        # 将动画设置到标签上
        self.l_fs.setMovie(self.movie)
        # 启动动画
        self.movie.start()

        # 创建 TcpReadThread 对象并连接信号
        self.tcp_read_thread = TcpReadThread()
        self.tcp_read_thread.responseReceived.connect(self.handle_response)

        # 创建定时器，每隔1秒读取一次数据
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_data)
        self.timer.start(10000)

        # 立即更新一次数据
        self.update_data()

    def update_data(self):
        # 启动 TcpReadThread 线程，开始读取数据
        self.tcp_read_thread.start()

    @pyqtSlot(int, bytes)
    def handle_response(self, index, response):
        # 将接收到的字节数据转换为列表
        ll = list(response)
        # print("收到数据:",index, response, len(response),bin(response[3]))
        if index == 1:
            # 计算光照强度值
            gm = ((response[3] << 24) + (response[4]<<16)+ (response[5]<<8) + response[6] )/ 10

            # 打印光照强度值
            print(gm)
            # 在界面上显示光照强度值
            self.l_wendu.setText(str(gm) + " Lux")

            try:
                # 连接数据库
                conn = mysql.connector.connect(
                    host="localhost",
                    user="root",
                    password="Kaiyuan1028!",
                    database="mydatabase"
                )
                cursor = conn.cursor()

                # 先尝试更新id为1的记录
                update_query = "UPDATE users SET light_data = %s WHERE id = 1"
                cursor.execute(update_query, (gm,))

                # 如果没有更新到记录，则改为插入或忽略
                if cursor.rowcount == 0:
                    try:
                        insert_query = "INSERT INTO users (id, light_data) VALUES (1, %s) ON DUPLICATE KEY UPDATE light_data = VALUES(light_data)"
                        cursor.execute(insert_query, (gm,))
                    except mysql.connector.Error as err:
                        print(f"插入数据失败: {err}")

                conn.commit()
                print("光照数据已成功更新/写入数据库")
            except mysql.connector.Error as err:
                print(f"数据库错误: {err}")
            finally:
                if 'conn' in locals() and conn.is_connected():
                    cursor.close()
                    conn.close()

            # 线程休眠 0.3 秒
            time.sleep(0.3)

    def on_thread_finished(self):
        # 打印线程执行完成的信息
        print("线程执行完成")

if __name__ == "__main__":
    # 创建一个 QApplication 对象
    app = QApplication(sys.argv)
    # 打印命令行参数
    print(sys.argv)
    if sys.argv != None and len(sys.argv) == 5:
        # 如果命令行参数数量为 5，则按指定参数运行
        print("按指定参数运行")
        SERVER_ADDRESS1 = sys.argv[1]
        SERVER_PORT1 = int(sys.argv[2])
    else:
        # 打印使用说明和默认参数
        print("main.exe {ip1} {port1} {ip2} {port2}")
        print("default:")
        print("main.exe 192.168.1.100")
    # 创建主窗口对象
    window = MainWindow()
    # 显示主窗口
    window.show()
    # 进入应用程序的主循环，直到窗口关闭
    sys.exit(app.exec_())
